/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estados;

import estados.Thread.VerificarConexao;
import Diversos.Numbers;
import Principal.comandosUSB;
import java.awt.TextArea;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JToggleButton;

/**
 *
 * @author linton
 */
public class Estados {

    private comandosUSB comandos;
    //private byte[] bufferSaida;
    //private byte[] bufferEntrada;
    private boolean conectado;
    private ExecutorService threadExecutor;
    private double errosCont=0;
  int pid;
  int vid;



    public Estados() {
        comandos = new comandosUSB();
        //bufferEntrada = new byte[64];
        conectado = false;
        threadExecutor = Executors.newFixedThreadPool(1);
    }

    public boolean inicar(int pids, int vids) {
        pid=pids;
        vid=vids;
        conectado = comandos.conectar(pid, vid);
        return conectado;
    }

    public void verificaConexao(int Pid, int Vid, JToggleButton botao, TextArea text) {
        VerificarConexao verifica = new VerificarConexao(Pid, Vid, botao, text, this.comandos, this);
//        threadExecutor.shutdown();
//        threadExecutor.execute(verifica);
       
    }

    public void piscarLed() throws InterruptedException {
        byte[] bufferSaida = new byte[64];
        bufferSaida[0] = (byte) 128;
        comandos.enviar(bufferSaida);
    }
   
    public int verificarBotao() {
        byte[] bufferSaida = new byte[64];
        byte[] bufferEntrada = new byte[64];
        bufferSaida[0] = (byte) 129;
        comandos.enviar(bufferSaida);
        bufferEntrada = comandos.receber();

        if (bufferEntrada.length != 0) {
            if (bufferEntrada[0] == (byte) 129) {
                if (bufferEntrada[1] == 0) {
                    return 0;//botão está pressionado
                } else {
                    return 1;//botão não está pressionado
                }
            }
        }
        return 2;//quando não foi possivel receber os dados do dispositivo
    }
    // manda o dispositivos realizar uma conversão A/D e retorna o resultado
    public double converter() {
        byte[] bufferSaida = new byte[64];
        byte[] bufferEntrada = new byte[64];
        bufferSaida[0] = (byte) 130;
        comandos.enviar(bufferSaida);
        bufferEntrada=null;
        while(bufferEntrada==null)
            bufferEntrada = comandos.receber();

        double resultado=0;
        try {//transforma o buffer de bytes para um numero inteiro
            resultado=((bufferEntrada[2] & 0xFF) << 8)+ (bufferEntrada[1] & 0xFF);
        } catch (Exception e) {
            errosCont++;
            return converter();
        }
        System.out.println(resultado);
        if (resultado==0)
            return converter();
        if (resultado==1)
            return 0;
        resultado--;
        resultado = resultado*5/1023;

        resultado=new Numbers().round(resultado, 3);//arredondar o numero

        
        
        return resultado;
    }

     public boolean gravarMemoria(char dado, char endereco){

        byte[] bufferSaida = new byte[64];
        bufferSaida[0] = (byte) 132;
        bufferSaida[1] = (byte)0;
        bufferSaida[2] = (byte)endereco;
        bufferSaida[3] = (byte)dado;
        comandos.enviar(bufferSaida);

        return true;
    }

    public char lerMemoria(char endereco) throws InterruptedException{
        Thread.sleep(60);
        byte[] bufferSaida = new byte[64];
        byte[] bufferEntrada = new byte[64];
        bufferSaida[0] = (byte) 133;
        bufferSaida[1] = (byte) 0;
        bufferSaida[2] = (byte) endereco;
        comandos.enviar(bufferSaida);
        bufferEntrada = comandos.receber();

         if (bufferEntrada.length != 0) {//erro
            return (char) bufferEntrada[1];
        }
        return 'e';

    }

    public boolean isConectado() {
        return comandos.conectar(pid, vid);
    }

    public void setConectado(boolean conectado) {
        this.conectado = conectado;
    }

    public double getErrosCont() {
        return errosCont;
    }

    public void setErrosCont(int errosCont) {
        this.errosCont = errosCont;
    }
}
